package demo.common;

import java.io.*;

public class BinaryTool {

    //下列逻辑，不仅是 Message，还是 java 中其他的对象，都可以通过这样的逻辑进行序列化
    //想让这个对象能够序列化或者反序列化，需要让这个类实现 Serializable 接口

    //把一个对象序列化成一个字节数组
    public static byte[] toBytes(Object object) throws IOException {
        //相当于是一个变长的字节数组
        //可以把 object 序列化的数据给逐渐的写入到 byteArrayOutputStream 中，再同一转成 byte[]
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
            try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)){
                //writeObject 会把该对象序列化，生成二进制字节数据，写入到 objectOutputStream
                //objectOutputStream 又关联到 byteArrayOutputStream，最终结果就写入到 byteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            //把 byteArrayOutputStream 中持有的二进制数据取出来，转成 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

    //把一个字节数组序列化成一个对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)){
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
                //readObject 从 data 这个 byte[] 中读取数据进行反序列化
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
